查看原文
其他

Flutter 您需要知道的知识点 | FAQ・第三期

Flutter 谷歌开发者 2019-05-22

Flutter 是一套高效的跨平台免费开源 SDK,可以帮助开发者用一套代码同时在 Android 和 iOS 上构建媲美原生体验的精良应用。随着 Flutter 从 1.0 升级到 1.2,我们从社区中也搜集到了不少开发者关注的问题,我们会用连载的形式由浅到深地为开发者们进行解答。如果您对 Flutter 已经有一定的了解,不妨在看到问题的时候先试着回答,然后和我们给出的答案进行比较,从而进一步加深理解。


下面开始 Flutter FAQ 第三期: 技术篇


问题 1:

Flutter 是使用什么技术构建的?

点击下方空白区域查看答案 

Flutter 使用 C、C++、Dart 和 Skia (2D 渲染引擎) 构建。您可以参阅下面这张架构图。


问题 2:

Flutter 如何在 Android 上运行我的代码?

点击下方空白区域查看答案 

引擎的 C 和 C++ 代码使用 Android 的 NDK 编译。Dart 代码 (SDK 的和您写的) 都是预先 (ahead-of-time, AOT) 编译成本地 ARM 及 x86 库。这些库被包含在一个 Android "runner" 项目中,然后整套内容被编译成一个 APK。当应用启动时,它会加载 Flutter 库。任何渲染、输入或事件处理等都会 delegate 给编译好的 Flutter 和应用代码。这个工作机制与很多游戏引擎颇为相似。


调试模式时则使用虚拟机 (VM) 来运行 Dart 代码(因此这时会显示 "Debug" 字样,以提醒开发者速度会稍微变慢),这样便可以启用有状态热重载 (Stateful Hot Reload)。

问题 3:

Flutter 如何在 iOS 上运行我的代码?

点击下方空白区域查看答案 

引擎的 C 和 C++ 代码使用 LLVM 编译。Dart 代码 (SDK 的和您的) 都是预先 (ahead-of-time, AOT) 编译成本地 ARM 库。这些库被包含在一个 iOS "runner" 项目中,然后整套内容被编译成一个 .ipa。当应用启动时,它会加载 Flutter 库。任何渲染、输入或事件处理等都会 delegate 给编译好的 Flutter 和应用代码。这个工作机制与很多游戏引擎颇为相似。


调试模式时则使用虚拟机 (VM) 来运行 Dart 代码 (因此这时会显示 "Debug" 字样,以提醒开发者速度会稍微变慢),这样便可以启用有状态热重载 (Stateful Hot Reload)。


问题 4:

Flutter 是否会使用系统的 OEM widget?

点击下方空白区域查看答案 

不会。相反,Flutter 自己提供了一套 widget (包括 Material Design 和 iOS 风格的 Cupertino widget),由 Flutter 的框架和引擎负责管理和渲染。


  • 浏览 Flutter widget 目录

    https://flutter.dev/docs/development/ui/widgets


我们希望最终能够产生出更高质量的应用。如果我们直接使用 OEM 自带的 widget,那么 Flutter 应用的质量和性能将受到这些 widget 质量的限制。


例如,在 Android 中,有一组硬编码的手势和固定的计算规则来区别它们。在 Flutter 中,您可以编写自己的手势识别器,它在手势系统中拥有最高的优先级。此外,由不同人创作的两个 widget 可以进行协调,以便消除手势的歧义。


  • 手势系统

    https://flutter.dev/docs/development/ui/advanced/gestures


如今的应用设计趋势表明,很多设计师和用户都需要动效丰富的 UI,同时富有品牌表现力。为了实现这种级别的美学定制化设计,Flutter 在架构上就会倾向于直接驱动像素,而不是交给 OEM widget 来处理。


由于使用相同的渲染器、框架和 widget,就意味着您能更加轻松地同时发布 iOS 和 Android 版本应用,而无需耗费精力和成本来规划和同步两套独立的代码库和功能集。


另外,使用单一的语言、单个框架和同一组适用于所有 UI 的库 (无论您的 UI 在每个移动平台上都各有不同还是基本一致),也有助于帮助您降低应用开发和维护成本。



问题 5:

我的移动 OS 更新并加入新的 widget 时会怎么样?

点击下方空白区域查看答案 

Flutter 团队密切关注来自 iOS 和 Android 的 widget 使用和需求情况,且会与社区合作,对新的 widget 提供构建支持。这些支持可能会以这些形式来提供给开发者: 较低层级的框架功能、新的可编辑组合的 widget,或全新的 widget 实现。


Flutter 的分层架构旨在支持众多 widget 库,我们鼓励并支持社区构建和维护 widget 库。

问题 6:

我的移动 OS 更新并加入新的平台功能时会怎么样?

点击下方空白区域查看答案 

Flutter 的互操作 (interop) 和插件 (plugin) 系统旨在使开发者能够立即访问新的移动操作系统特性和功能。开发者不必等待 Flutter 团队提供新系统功能的访问接口,而是自己第一时间即可使用。

问题 7:

我能使用哪些操作系统开发 Flutter 应用?

点击下方空白区域查看答案 

Flutter 支持使用 Linux、Mac 和 Windows 进行开发。

问题 8:

Flutter 是用哪种语言写成的?

点击下方空白区域查看答案 

我们对比了很多开发语言和运行时,并最终采用了 Dart 来编写框架和 widget。底层图形框架和 Dart 虚拟机在 C/C++ 中实现。

问题 9:

Flutter 为什么选择使用 Dart?

点击下方空白区域查看答案 

Flutter 使用四个主要维度进行评估,并综合考虑了框架开发者、应用开发者和最终用户的需求。我们发现某些语言的确在某些维度符合要求,但 Dart 在所有评估维度上都取得了高分,并且符合我们的所有要求和标准。


Dart 的运行时和编译器支持 Flutter 的两个关键特性: 基于 JIT 的快速开发周期,允许在带类型的语言中支持形变和有状态热重载,以及一个能产出高效率 ARM 代码的 AOT 编译器,从而确保快速启动的能力和可预期的生产版本运行性能。


此外,我们还有幸与 Dart 社区展开了密切合作,Dart 社区积极投入资源改进 Dart,以便在 Flutter 中更易使用。例如,当我们采用 Dart 时,该语言还没有用于生成原生二进制文件的 AOT 工具链,这些工具有助于实现稳定的高性能表现,但在 Dart 团队为 Flutter 构建了这些工具后,这个缺失已经不复存在了。同样,Dart VM 之前是针对吞吐量进行的优化,但团队现在正在针对延迟进行优化,这对于解决 Flutter 的工作负载更为重要。


在评估时,Dart 在以下主要标准上得分很高:


开发者的生产力。Flutter 的主要价值之一就是让开发者能使用相同的代码库为 iOS 和 Android 创建应用,以便节省开发资源。使用高效率的语言可以进一步提升开发者的工作效率,使 Flutter 更具吸引力。这对我们的框架开发团队和最终开发者来说都非常重要。Flutter 的大部分内容所使用的语言都与我们为开发者提供的语言相同,因此我们需要在数十万行的代码中保持高效率,同时避免牺牲我们开发出来的框架和 widget 的亲和力以及可读性。


面向对象。对于 Flutter 而言,我们需要一种适合其问题域——创建可视化用户体验——的语言。这个领域中沉淀了数十年的面向对象构建 UI 框架的经验。虽然我们可以使用非面向对象语言,但这意味着,为了解决几个难题,我们要 "重新发明轮子"。此外,绝大多数开发者都拥有面向对象开发的经验,因此可以更轻松地学习如何使用 Flutter 进行开发。


稳定可期的高性能表现。我们希望开发者能够通过 Flutter 创建快速而流畅的用户体验。为了实现这一点,我们需要能够在每个动画帧期间运行大量的最终开发者代码。这意味着我们需要的语言一方面既要拥有高性能,另一方面又需要避免因周期性的中断而影响帧率,即 "可期性"。


快速内存分配。Flutter 框架使用的函数式流程,很大程度上依赖于下层的内存分配器高效地对小型的、短生命周期的内容进行内存分配。这个流程是使用支持这种分配机制的语言进行开发的,在缺少这个机制的语言中无法有效运作。


问题 10:

Flutter 能运行任何 Dart 代码吗?

点击下方空白区域查看答案 

Flutter 应该能够运行大多数没有引用 dart:mirrors 或 dart:html (不论是直接还是间接引用) 的 Dart 代码。

问题 11:

Flutter 引擎有多大?

点击下方空白区域查看答案 

在 2018 年 12 月,我们实测了一个最简版本的 Flutter 应用 (即不含 Material 组件,只包含一个使用 flutter build apk 构建的 Center widget) 的下载体积 ,这个经过打包和压缩处理的 APK 大约为 4.06 MB。


  • GitHub 上的最简应用

    https://github.com/flutter/flutter/tree/75228a59dacc24f617272f7759677e242bbf74ec/examples/hello_world


对于这个最简应用,核心引擎体积约为 2.7 MB (压缩后),框架 + 应用代码体积约为 820.6 KB (压缩后),LICENSE 文件体积为 53.5 KB (压缩后),必要的 Java 代码 (classes.dex) 体积为 61.8 KB (压缩后),并且有大约 450.4 KB的 ICU 数据 (压缩后)。


这些数字是由 Android Studio 内置的 apkanalyzer 实测得出。


  • apkanalyzer

    https://developer.android.google.cn/studio/command-line/apkanalyzer


在 iOS 平台上,跟据 App Store Connect 的数据,同一应用的发布 IPA 在 iPhone X 上的下载文件体积为 10.8 MB。IPA 比 APK 大,主要是因为 Apple 加密了 IPA 中的二进制文件,使得压缩效率降低。


  • iOS App Store Specific Considerations - 关于加密

    https://developer.apple.com/library/archive/qa/qa1795/_index.html#//apple_ref/doc/uid/DTS40014195-CH1-APP_STORE_CONSIDERATIONS


当然,您的实际情况可能跟我们所说的有所不同,我们建议您测量自己的应用的体积。想要测量 Android 应用体积,请运行 flutter build apk,并将 APK (build/app/outputs/apk/release/app-release.apk) 加载到 Android Studio 中,以便获取详细的体积报告。想要测量 iOS 应用,请将发布 IPA 加载到 App Store Connect 并获取体积报告。


  • 使用 Android Studio 加载 APK

    https://developer.android.google.cn/studio/build/apk-analyzer


  • 使用 App Store Connect 加载 IPA

    https://flutter.dev/docs/deployment/ios

如果您在使用 Flutter 构建应用的时候有什么想法或疑问,欢迎在评论区给我们留言。我们期待着看到您为不同平台的用户们打造出同样精美、高效的体验!


 点击屏末 | | 了解 Flutter 更多详细信息



推荐阅读


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存